/*
Copyright 2011 Mary Suárez Machado

Este programa es de software libre: usted puede redistribuirlo y/o modificarlo según los términos de la Licencia de Gran pública de GNU como publicado por la Fundación de Software Libre, versión 3 de la Licencia, (o en su opción) cualquier versión posterior.

 Este programa es distribuido en la esperanza que será útil, pero SIN CUALQUIER GARANTÍA; sin aún la garantía implícita de VALOR COMERCIAL O SALUD PARA UN OBJETIVO PARTICULAR. Mirar la Licencia de Gran pública de GNU para más detalles.
*/


 /**
 *@file mp2gunzip.cpp
 *@brief Programa principal que resuelve la decodificación de un texto
 *@author Mary Carmen Suarez
 *
 */

#include <iostream>
#include <fstream>
#include <cstring>
#include <TablaLongitud.h>
#include <TablaDistancia.h>
#include <VectorBits.h>
#include <TablaHuffmanD.h>
#include <TablaHuffmanLC.h>
#include <crc.h>
#include <LZcoder.h>
#include <Vector.h>
#include <GunLZcoder.h>

using namespace std;

//El programa recibe desde la linea de ordenes el fichero a descomprimir

int main (int argc, char* argv[])
{
/********************** Separamos los datos del fichero comprimido en variables **************************/

	if(argc != 2)
	{
		cerr << "El numero de argumentos es incorrecto." << endl;
		return 1;
	}
	char cabecera[10];
	Vector nombre_fi, comentario;
	ifstream fi;
	fi.open(argv[1]);
	if (!fi)
	{
		cerr << "Error en la carga del fichero." << endl;
		return 1;
	}
	fi.read(cabecera,10);
	if (cabecera[3] == 0x18)
	{
		nombre_fi.Leer(fi);
		comentario.Leer(fi);
	}
	unsigned int pos_ini = fi.tellg();
	fi.seekg(-8,ios::end);
	unsigned int pos_final = fi.tellg();
	unsigned int tam_fi = pos_final - pos_ini;
	unsigned int tam_original, crc_original;
	fi.read((char*)&crc_original,4);
	fi.read((char*)&tam_original,4);	
	fi.seekg(pos_ini);
	VectorBits vector;
	vector.Leer(fi,tam_fi);
	int tam =  nombre_fi.GetNelem();
	char salida[tam+1];
	for (int i=0; i<tam; i++)
		salida[i]=nombre_fi.GetCaracter(i);
    salida[tam]=0;

/********************* Abrimos el fichero de salida y descomprimimos el fichero de entrada *****************/

	ofstream fs;
	fs.open(salida);
	if (!fs)
	{
		cerr << "error de apertura "<< endl;
		return -1;
	}
	GunLZcoder gun(vector);
	gun.Descodificacion(fs);
	unsigned int crc_nuevo = gun.GetParidad();
	unsigned int tam_nuevo = gun.Nelem();

/******************** Comprobamos los crc y los tamaños ************************************************/

	if ( crc_original != crc_nuevo || tam_original != tam_nuevo)
	{
		cerr << "Error no coincide el crc ó el tamano" << endl;
		return -1;
	}
}

